home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / UUCP / UUCon / Source / ConController.m < prev    next >
Text File  |  1994-05-23  |  9KB  |  390 lines

  1. /*
  2.  
  3.   Ronin Consulting, Inc.
  4.     Copyright (C) 1992, Nicholas Christopher (nwc@gun.com)
  5.  
  6.     This library is free software; you can redistribute it and/or
  7.     modify it under the terms of the GNU Library General Public
  8.     License as published by the Free Software Foundation; either
  9.     version 2 of the License, or (at your option) any later version.
  10.  
  11.     This library is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.     Library General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU Library General Public
  17.     License along with this library; if not, write to the Free
  18.     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20. */
  21.  
  22. #import "version.h"
  23. #import "Defaults.h"
  24. #import "EnhancedText.h"
  25. #import "EnhancedApp.h"
  26. #import "Subprocess.h"
  27. #import "ConController.h"
  28. #import "LogController.h"
  29. #import "InfoController.h"
  30. #import "SweepView.h"
  31.  
  32. #import <appkit/appkit.h>
  33. #import <string.h>
  34.  
  35. static char tempFile[30] =  "/tmp/.UUCon.XXXXXX"; 
  36. static void sweepIncrement(DPSTimedEntry teNumber, double now, void *userData);
  37.  
  38. @interface ConController (PRIVATE)         /* Private methods */
  39. -_startSweep;
  40. -_endSweep;
  41. @end
  42.  
  43. @implementation ConController
  44.  
  45. - init
  46. {
  47.    [super init];
  48.  
  49.    [NXApp appDirectory];             /* cd to Apps directory so files in wrapper can be found */
  50.    defaults = [Defaults new];         
  51.    teNum = (DPSTimedEntry)0;
  52.    procType = NO_SPROC;
  53.    logfile = syslog = nil;
  54.    return self;
  55. }
  56.  
  57.  
  58. - pollHost:sender
  59. {
  60.  
  61.    const char *host = [hostsPopUp title];
  62.    char buff[80 + strlen(host)];
  63.  
  64.    if(procType != NO_SPROC)
  65.        return self;
  66.  
  67.    sprintf(buff,"Polling host: %s\n", host);
  68.    [consoleLog appendString: buff];
  69.  
  70.    [self _startSweep];
  71.  
  72.    if(*[defaults get: "DebugPoll"] == 'Y' && !auditProc)
  73.    {
  74.       auditFile = mktemp(tempFile);         /* build a temporary audit file */
  75.       sprintf(buff,"/usr/lib/uucp/uucico -r1 -s%s -x9 2> %s", host, auditFile);
  76.    }
  77.    else
  78.    {
  79.       [consoleLog appendString: "\nStarting to Poll - check log tool to watch progress\n"];
  80.       sprintf(buff,"uupoll %s", host);
  81.    }
  82.  
  83.    procType = POLL_HOST;
  84.    subProc = [[Subprocess alloc] init: buff withDelegate: self];
  85.  
  86.    if(*[defaults get: "DebugPoll"] == 'Y')
  87.    {
  88.       sprintf(buff, "tail -f %s", auditFile);
  89.       auditProc = [[Subprocess alloc] init: buff withDelegate: self];
  90.    }
  91.  
  92.    return self;
  93. }
  94.  
  95. - getBPS: sender
  96. {
  97.    char cmd[512] = "tail -14 /usr/spool/uucp/SYSLOG | fgrep bytes | \
  98.          awk '/failed/ { printf \" %8d bytes %8s (%8s) in %7.2f sec FAILED\\n\",\
  99.          $7, $5, $2, $9 } \
  100.          { if ( $7 > 100 && ($9 + 0) > 0) \
  101.             { bytes += $7; seconds += $9; \
  102.             printf \"%8d bytes %8s(%s) in %7.2f\\n\", $7, $5, $2, $9}} \
  103.          END { printf \"\\nAvg %8.2f bps\\n\", (bytes/seconds) * 8 }'"; 
  104.  
  105.    if (procType != NO_SPROC)
  106.        return self;
  107.  
  108.    [self _startSweep];
  109.    [consoleLog appendString: "Speed of last 7 jobs\n"];
  110.    procType = GET_BPS;
  111.    subProc = [[Subprocess alloc] init: cmd withDelegate: self];
  112.  
  113.    return self;
  114.                                           
  115. }
  116.  
  117. - hostsQueue:sender
  118. {
  119.    const char *host = [hostsPopUp title];
  120.    char buff[80 + strlen(host)];
  121.    
  122.    if(procType != NO_SPROC)
  123.        return self;
  124.  
  125.    [self _startSweep];
  126.  
  127.    sprintf(buff,"Queue for host: %s\n", host);
  128.    [consoleLog appendString: buff];
  129.    
  130.    sprintf(buff,"uuq -l -s%s -b%s", host, [defaults get: "BaudRate"]);
  131.  
  132.    procType = HOST_QUEUE;
  133.    subProc = [[Subprocess alloc] init: buff withDelegate: self];
  134.  
  135.    return self;
  136. }
  137.  
  138. - hostsSnap:sender
  139. {
  140.    if(procType != NO_SPROC)
  141.        return self;
  142.  
  143.    [self _startSweep];
  144.  
  145.    [consoleLog appendString: "Snapshot of uucp hosts\n"];
  146.    
  147.    procType = SNAP_HOSTS;
  148.    subProc = [[Subprocess alloc] init: "uusnap" withDelegate: self];
  149.  
  150.    return self;
  151. }
  152.  
  153. - setConsoleLog:sender
  154. {
  155.    consoleLog = [sender docView];
  156.    return self;
  157. }
  158.  
  159. - deleteJob:sender
  160. {
  161.    const char *host = [hostsPopUp title];
  162.    const char *job = [consoleLog selectedText];
  163.    char buff[80 + strlen(host) + strlen(job)];
  164.  
  165.    if(procType != NO_SPROC)
  166.        return self;
  167.  
  168.    [self _startSweep];
  169.  
  170.    sprintf(buff,"Deleting job %s for host: %s\n", job, host);
  171.    [consoleLog appendString: buff];
  172.    sprintf(buff, "uuq -s%s -d%s", host, job);
  173.    
  174.    procType = DELETE_JOB;
  175.    subProc = [[Subprocess alloc] init: buff withDelegate: self];
  176.  
  177.    return self;
  178. }
  179.  
  180. - keyWindowLogClear: sender
  181. {
  182.    id keyController = [[NXApp keyWindow] delegate];
  183.  
  184.  
  185.    if([keyController respondsTo: @selector(logClear)])
  186.        [keyController logClear];
  187.  
  188.    return self;
  189. }
  190.  
  191. - logClear
  192. {
  193.    [consoleLog empty: self];
  194.    return self;
  195. }
  196.  
  197. - syslog: sender
  198. {
  199.    if(!syslog)
  200.        syslog = [[LogController alloc] initForCommand: "tail -10f /usr/spool/uucp/SYSLOG" entitled: "SYSLOG" ];
  201.  
  202.    [syslog makeKeyAndOrderFront: self];
  203.  
  204.    return self;
  205. }
  206.  
  207.  
  208. - logfile: sender
  209. {
  210.  
  211.    if(!logfile)
  212.        logfile = [[LogController alloc] initForCommand: "tail -10f /usr/spool/uucp/LOGFILE" entitled: "LOGFILE" ];
  213.  
  214.    [logfile makeKeyAndOrderFront: self];
  215.  
  216.    return self;
  217. }
  218.  
  219. @end                         /* ConController */
  220.  
  221. @implementation ConController (PRIVATE)
  222.  
  223. -_startSweep
  224. {
  225.    [progress setIntValue: 0];
  226.    teNum = DPSAddTimedEntry(.02, sweepIncrement, &progress, NX_RUNMODALTHRESHOLD + 1);
  227.    return self;
  228. }
  229.  
  230. -_endSweep
  231. {
  232.    if(teNum)
  233.    {
  234.       DPSRemoveTimedEntry(teNum);
  235.       teNum = (DPSTimedEntry)0;
  236.    }
  237.  
  238.    [progress setIntValue: -1];
  239. //   [progress display];                 
  240.    return self;
  241. }
  242.  
  243. @end                         /* ConController (PRIVATE) */
  244.  
  245. @implementation ConController (ApplicationDelegate)
  246.  
  247. - appDidInit:sender
  248. {
  249.    /* if this program is set gid to daemon and L.sys is group readable to same we can debug */
  250.    setgid(getegid());    
  251.  
  252.    [infoController setVersionValue: version];
  253.    procType = BUILDING_MENU;
  254.    subProc = [[Subprocess alloc] init: "uuname" withDelegate: self];
  255.    [progress setIntValue: -1];
  256.    [progress setStepSize: 10];
  257.    return self;
  258. }
  259.  
  260. - appWillTerminate:sender
  261. {
  262.    if(procType != NO_SPROC)
  263.        [subProc free];
  264.  
  265.    if(auditProc)
  266.        [auditProc free];
  267.  
  268.    if(logfile)
  269.        [logfile free];
  270.  
  271.    if(syslog)
  272.        [syslog free];
  273.  
  274.    return self;
  275. }
  276.  
  277. @end                         /* ApplicationDelegate */
  278.  
  279.  
  280. @implementation ConController (SubprocessDelegate)
  281.  
  282. - subprocess:sender done:(int)exitStatus
  283. {
  284.    switch(procType)
  285.    {
  286.     case BUILDING_MENU:
  287.       [[hostsPopUp target] removeItem: [hostsPopUp title]];
  288.       [hostsPopUp setTitle: [[[[hostsPopUp target] itemList] cellAt:0:0] title]];
  289.                          /* choose the default host if one set */
  290.       if([[hostsPopUp target] indexOfItem: [defaults get: "DefaultHost"]] != -1)
  291.       [hostsPopUp setTitle: [defaults get: "DefaultHost"]];
  292.  
  293.       [consoleLog appendString: "Ready to go.\n"];
  294.  
  295.       if(*[defaults get: "ShowLog"] == 'Y')
  296.       [self logfile: self];
  297.  
  298.       if(*[defaults get: "ShowSysLog"] == 'Y')
  299.       [self syslog: self];
  300.  
  301.       [window makeKeyAndOrderFront: self];
  302.  
  303.       break;
  304.  
  305.     case HOST_QUEUE:
  306.       [consoleLog appendString: "\nQueue Complete\n"];
  307.       break;
  308.  
  309.     case SNAP_HOSTS:
  310.       [consoleLog appendString: "\nSnapshot Complete\n"];
  311.       break;
  312.  
  313.     case POLL_HOST:
  314.  
  315.       if(auditProc)
  316.       {
  317.      [consoleLog appendString:"\nDebug Poll done.\n"];
  318.      [NXApp delayedFree: auditProc];
  319.      auditProc = nil;
  320.      unlink(auditFile);
  321.       }
  322.       
  323.       break;
  324.  
  325.     case DELETE_JOB:
  326.       [consoleLog appendString: "\nDelete Complete\n"];
  327.       break;
  328.  
  329.     case GET_BPS:
  330.       [consoleLog appendString: "\nSpeed Listing Complete.\n"];
  331.       break;
  332.  
  333.     case NO_SPROC:
  334.       return self;                 /* don't want to free unknown */
  335.       break;
  336.    }
  337.  
  338.    if(sender == subProc)
  339.    {
  340.       procType = NO_SPROC;
  341.       [self _endSweep];
  342.    }
  343.    
  344.    [NXApp delayedFree: sender];
  345.    return self;
  346. }
  347.  
  348. - subprocess:sender output:(char *)buffer
  349. {
  350.  
  351.    [progress increment: self];
  352.  
  353.    switch(procType)
  354.    {
  355.     case BUILDING_MENU:
  356.       [[hostsPopUp target] addItem: buffer];
  357.       break;
  358.  
  359.     default:
  360.       [consoleLog appendString: buffer];
  361.       [consoleLog appendString: "\n"];
  362.       break;
  363.    }
  364.  
  365.    return self;
  366. }
  367.  
  368. - subprocess:sender stderrOutput:(char *)buffer
  369. {
  370.    [progress increment: self];
  371.  
  372.    [consoleLog appendString: buffer];
  373.    return self;
  374. }
  375.  
  376. - subprocess:sender error:(const char *)errorString
  377. {
  378.    [consoleLog appendString: "Failed to create subprocess.\n"];
  379.    return self;
  380. }
  381.  
  382.  
  383. @end
  384.  
  385.  
  386. void sweepIncrement(DPSTimedEntry teNumber, double now, void *userData)
  387. {
  388.    [*(id *)userData increment: nil];
  389. }
  390.